<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head><title>Apache Felix - Apache Felix OSGi Bundle Repository (OBR)</title>


    <link rel="stylesheet" href="apache-felix-osgi-bundle-repository-obr_files/site.css" type="text/css" media="all">
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
</head>
<body linkifying="true">
<div class="title">
    <div class="logo"><a href="http://felix.apache.org/site/index.html"><img alt="Apache Felix"
                                                                             src="apache-felix-osgi-bundle-repository-obr_files/logo.png"
                                                                             border="0"></a></div>
    <div class="header"><a href="http://www.apache.org/"><img alt="Apache"
                                                              src="apache-felix-osgi-bundle-repository-obr_files/apache.png"
                                                              border="0"></a></div>
</div>
<div class="menu">
    <ul>
        <li><a href="http://cwiki.apache.org/FELIX/index.html" title="Index">home</a></li>
        <li><a href="http://cwiki.apache.org/FELIX/news.html" title="news">news</a></li>
        <li><a href="http://cwiki.apache.org/FELIX/status.html" title="status">status</a></li>
        <li><a href="http://cwiki.apache.org/FELIX/license.html" title="license">license</a></li>
        <li><span class="nobr"><a href="http://felix.apache.org/site/downloads.cgi"
                                  title="Visit page outside Confluence" rel="nofollow">downloads<sup><img
                class="rendericon" src="apache-felix-osgi-bundle-repository-obr_files/linkext7.gif" alt=""
                align="absmiddle" border="0" height="7" width="7"></sup></a></span></li>
        <li><a href="http://cwiki.apache.org/FELIX/documentation.html" title="documentation">documentation</a></li>
        <li><a href="http://cwiki.apache.org/FELIX/mailinglists.html" title="mailinglists">mailing lists</a></li>
        <li><span class="nobr"><a href="http://cwiki.apache.org/confluence/x/O-" title="Visit page outside Confluence"
                                  rel="nofollow">wiki<sup><img class="rendericon"
                                                               src="apache-felix-osgi-bundle-repository-obr_files/linkext7.gif"
                                                               alt="" align="absmiddle" border="0" height="7" width="7"></sup></a></span>
        </li>
        <li><a href="http://cwiki.apache.org/FELIX/committers.html" title="committers">committers</a></li>
        <li><a href="http://cwiki.apache.org/FELIX/faq.html" title="faq">faq</a></li>
        <li><a href="http://cwiki.apache.org/FELIX/roadmap.html" title="roadmap">roadmap</a></li>
        <li><a href="http://cwiki.apache.org/FELIX/sourcecode.html" title="sourcecode">source code</a></li>
        <li><a href="http://cwiki.apache.org/FELIX/codingstandards.html" title="codingstandards">coding standards</a>
        </li>
        <li><a href="http://cwiki.apache.org/FELIX/issuetracking.html" title="issuetracking">issue tracking</a></li>
        <li><a href="http://cwiki.apache.org/FELIX/dependencies.html" title="dependencies">dependencies</a></li>
        <li><span class="nobr"><a href="http://www.apache.org/" title="Visit page outside Confluence" rel="nofollow">apache
            software foundation<sup><img class="rendericon"
                                         src="apache-felix-osgi-bundle-repository-obr_files/linkext7.gif" alt=""
                                         align="absmiddle" border="0" height="7" width="7"></sup></a></span></li>
        <li><span class="nobr"><a href="http://www.apache.org/foundation/sponsorship.html"
                                  title="Visit page outside Confluence" rel="nofollow">sponsorship<sup><img
                class="rendericon" src="apache-felix-osgi-bundle-repository-obr_files/linkext7.gif" alt=""
                align="absmiddle" border="0" height="7" width="7"></sup></a></span></li>
        <li><span class="nobr"><a href="http://www.apache.org/foundation/thanks.html"
                                  title="Visit page outside Confluence" rel="nofollow">sponsors<sup><img
                class="rendericon" src="apache-felix-osgi-bundle-repository-obr_files/linkext7.gif" alt=""
                align="absmiddle" border="0" height="7" width="7"></sup></a></span></li>
    </ul>
</div>
<div class="main">
<h1><a name="ApacheFelixOSGiBundleRepository(OBR)-ApacheFelixOSGiBundleRepository(OBR)"></a>Apache Felix OSGi Bundle
    Repository (OBR)</h1>

<ul>
    <li><a href="#ApacheFelixOSGiBundleRepository%2528OBR%2529-motivation"
           title="motivation on Apache Felix OSGi Bundle Repository (OBR)">Motivation</a></li>
    <li><a href="#ApacheFelixOSGiBundleRepository%2528OBR%2529-overview"
           title="overview on Apache Felix OSGi Bundle Repository (OBR)">Overview</a></li>
    <li><a href="#ApacheFelixOSGiBundleRepository%2528OBR%2529-repositoryfile"
           title="repository-file on Apache Felix OSGi Bundle Repository (OBR)">OBR Repository File</a></li>
    <li><a href="#ApacheFelixOSGiBundleRepository%2528OBR%2529-serviceapi"
           title="service-api on Apache Felix OSGi Bundle Repository (OBR)">OBR Service API</a></li>
    <li><a href="#ApacheFelixOSGiBundleRepository%2528OBR%2529-shellcommand"
           title="shell-command on Apache Felix OSGi Bundle Repository (OBR)">OBR Shell Command</a>
        <ul>
            <li><a href="#ApacheFelixOSGiBundleRepository%2528OBR%2529-obrhelp"
                   title="obr-help on Apache Felix OSGi Bundle Repository (OBR)"><tt>obr help</tt></a></li>
            <li><a href="#ApacheFelixOSGiBundleRepository%2528OBR%2529-obrlisturl"
                   title="obr-list-url on Apache Felix OSGi Bundle Repository (OBR)"><tt>obr list-url</tt></a></li>
            <li><a href="#ApacheFelixOSGiBundleRepository%2528OBR%2529-obraddurl"
                   title="obr-add-url on Apache Felix OSGi Bundle Repository (OBR)"><tt>obr add-url</tt></a></li>
            <li><a href="#ApacheFelixOSGiBundleRepository%2528OBR%2529-obrremoveurl"
                   title="obr-remove-url on Apache Felix OSGi Bundle Repository (OBR)"><tt>obr remove-url</tt></a></li>
            <li><a href="#ApacheFelixOSGiBundleRepository%2528OBR%2529-obrlist"
                   title="obr-list on Apache Felix OSGi Bundle Repository (OBR)"><tt>obr list</tt></a></li>
            <li><a href="#ApacheFelixOSGiBundleRepository%2528OBR%2529-obrinfo"
                   title="obr-info on Apache Felix OSGi Bundle Repository (OBR)"><tt>obr info</tt></a></li>
            <li><a href="#ApacheFelixOSGiBundleRepository%2528OBR%2529-obrdeploy"
                   title="obr-deploy on Apache Felix OSGi Bundle Repository (OBR)"><tt>obr deploy</tt></a></li>
            <li><a href="#ApacheFelixOSGiBundleRepository%2528OBR%2529-obrstart"
                   title="obr-start on Apache Felix OSGi Bundle Repository (OBR)"><tt>obr start</tt></a></li>
            <li><a href="#ApacheFelixOSGiBundleRepository%2528OBR%2529-obrsource"
                   title="obr-source on Apache Felix OSGi Bundle Repository (OBR)"><tt>obr source</tt></a></li>
        </ul>
    </li>
    <li><a href="#ApacheFelixOSGiBundleRepository%2528OBR%2529-proxy"
           title="proxy on Apache Felix OSGi Bundle Repository (OBR)">Using OBR with a Proxy</a></li>
    <li><a href="#ApacheFelixOSGiBundleRepository%2528OBR%2529-sourcepackaging"
           title="source-packaging on Apache Felix OSGi Bundle Repository (OBR)">Bundle Source Packaging</a></li>
    <li><a href="#ApacheFelixOSGiBundleRepository%2528OBR%2529-feedback"
           title="feedback on Apache Felix OSGi Bundle Repository (OBR)">Feedback</a></li>
</ul>


<p><a name="ApacheFelixOSGiBundleRepository(OBR)-motivation"></a></p>

<h2><a name="ApacheFelixOSGiBundleRepository(OBR)-Motivation"></a>Motivation</h2>

<p>The goal of the Apache Felix OSGi Bundle Repository (OBR) is two-fold:</p>

<ol>
    <li>To simplify deploying and using available bundles with Felix.</li>
    <li>To encourage independent bundle development so that communities of interest can grow.</li>
</ol>


<p>OBR achieves the first goal by providing a service that can
    automatically install a bundle, with its deployment dependencies, from
    a bundle repository. This makes it easier for people to experiment with
    existing bundles. The second goal is achieved by raising the visibility
    of the available bundles and providing access to both the executable
    bundle and its source code. Hopefully, by making OBR and the bundles
    themselves more visible, community members will be encouraged to
    provide or improve service implementations.</p>

<p>Note: OBR provides access to the Felix' default bundle repository,
    but you can also use it to deploy your own bundles by creating a bundle
    repository meta-data file for your local bundles; see the <tt>obr list-url</tt>, <tt>obr add-url</tt>, and <tt>obr
        remove-url</tt> commands for more details.</p>

<p><a name="ApacheFelixOSGiBundleRepository(OBR)-overview"></a></p>

<h2><a name="ApacheFelixOSGiBundleRepository(OBR)-Overview"></a>Overview</h2>

<p>For the most part, OBR is quite simple. An OBR "repository server"
    is not necessary, since all functionality may reside on the client
    side. OBR is able to provide its functionality by reading an XML-based
    meta-data file that describes the bundles available to it. The
    meta-data file essentially contains an XML encoding of the bundles'
    manifest information. From the meta-data, OBR is able to construct
    dependency information for deploying (i.e., installing and updating)
    bundles.</p>

<p>OBR defines the following entities:</p>

<ul>
    <li><em><b>Repository Admin</b></em> - a service to access a federation of repositories.</li>
    <li><em><b>Repository</b></em> - provides access to a set of resources.</li>
    <li><em><b>Resource</b></em> - a description of an artifact to be installed on a device.</li>
    <li><em><b>Capability</b></em> - a named set of properties.</li>
    <li><em><b>Requirement</b></em> - an assertion on a capability.</li>
    <li><em><b>Resolver</b></em> - an object to resolve resource dependencies and to deploy them.</li>
    <li><em><b>Repository file</b></em> - XML file containing resource meta-data.</li>
</ul>


<p>The following diagram illustrates the relationships among these entities:</p>

<p><img src="apache-felix-osgi-bundle-repository-obr_files/obr-entities.png" align="absmiddle" border="0"></p>

<p>The client has access to a federated set of repositories via the Repository Admin service; such as depicted in this
    view:</p>

<p><img src="apache-felix-osgi-bundle-repository-obr_files/obr-high-level.png" align="absmiddle" border="0"></p>

<p><a name="ApacheFelixOSGiBundleRepository(OBR)-repositoryfile"></a></p>

<h2><a name="ApacheFelixOSGiBundleRepository(OBR)-OBRRepositoryFile"></a>OBR Repository File</h2>

<p>The OBR repository file is an XML-based representation of bundle
    meta-data. The goal is provide a generic model for describing
    dependencies among resources; as such, the term <em><b>resource</b></em> is used instead of <em><b>bundle</b></em>
    in the OBR repository syntax; a detailed description of the OBR meta-data format is available in the <span
            class="nobr"><a href="http://www2.osgi.org/download/rfc-0112_BundleRepository.pdf"
                            title="Visit page outside Confluence" rel="nofollow">OSGi RFC 112<sup><img
            class="rendericon" src="apache-felix-osgi-bundle-repository-obr_files/linkext7.gif" alt="" align="absmiddle"
            border="0" height="7" width="7"></sup></a></span>
    document; this document is not completely in sync with the
    implementation, but the concepts are still correct. The following XML
    snippet depicts the overall structure of a repository file:</p>

<div class="preformatted">
    <div class="preformattedContent">
<pre>&lt;repository presentationname="..." symbolicname="..." ... &gt;
    &lt;resource&gt;
        &lt;description&gt;...&lt;/description&gt;
        &lt;size&gt;...&lt;/size&gt;
        &lt;documentation&gt;...&lt;/documentation&gt;
        &lt;source&gt;...&lt;/source&gt;
        &lt;category id="..."/&gt;
        &lt;capability&gt;...&lt;/capability&gt;
        ...
        &lt;requirement&gt;...&lt;/requirement&gt;
        ...
    &lt;/resource&gt;
    ...
&lt;/repository&gt;
</pre>
    </div>
</div>

<p>The above repository defines a set of available resources, each
    described by a set of meta-data. Some resource meta-data is purely
    intended for human consumption; the most important aspects relate to
    the generic capability/requirement model.</p>

<p>A resource can provide any number of capabilities. A capability is a
    typed set of properties. For example, the following is an exported
    package capability:</p>

<div class="preformatted">
    <div class="preformattedContent">
<pre>&lt;capability name='package'&gt;
    &lt;p n='package' v='org.foo.bar'/&gt;
    &lt;p n='version' t='version' v='1.0.0'/&gt;
&lt;/capability&gt;
</pre>
    </div>
</div>

<p>This capability is of type 'package' and exports 'org.foo.bar' at
    version '1.0.0'. Conversely, a requirement is a typed LDAP query over a
    set of capability properties. For example, the following is an imported
    package requirement:</p>

<div class="preformatted">
    <div class="preformattedContent">
<pre>&lt;require name='package' extend='false'
    multiple='false' optional='false'
    filter='(&amp;amp;(package=org.foo.bar)(version&amp;gt;=1.0.0))'&gt;
    Import package org.foo.bar
&lt;/require&gt;
</pre>
    </div>
</div>

<p>This requirement is of type 'package' and imports 'org.foo.bar' at
    versions greater than '1.0.0'. Although this syntax looks rather
    complicated with the '\&amp;' and '\&gt;=' syntax, it is simply the
    standard OSGi LDAP query syntax in XML form (additionally, Peter Kriens
    has created a tool called <tt>bindex</tt> to generate this meta-data from a bundle's manifest).</p>

<p>With this generic dependency model, OBR is able to provide mappings
    for the various OSGi bundle dependencies; e.g., import/export package,
    provide/require bundle, host/fragment, import/export service, execution
    environment, and native code. In addition, it is possible for bundles
    to introduce arbitrary dependencies for custom purposes.</p>

<p>Two other important pieces of meta-data are <tt>Bundle-SymbolicName</tt> and <tt>Bundle-Version</tt>;
    these are standard OSGi bundle manifest attributes that OBR uses to
    uniquely identify a bundle. For example, if you want to use OBR to
    update a locally installed bundle, OBR gets its symbolic name and
    version and searches the repository metadata for a matching symbolic
    name. If the matching symbolic name is found, then OBR checks if there
    is a newer version than the local copy using the bundle version number.
    Thus, the symbolic name plus bundle version forms a unique key to match
    locally installed bundles to remotely available bundles.</p>

<p><a name="ApacheFelixOSGiBundleRepository(OBR)-serviceapi"></a></p>

<h2><a name="ApacheFelixOSGiBundleRepository(OBR)-OBRServiceAPI"></a>OBR Service API</h2>

<p>Typically, OBR service clients only need to interact with the
    Repository Admin service, which provides the mechanisms necessary to
    discover available resources. The Repository Admin interface is defined
    as follows:</p>

<div class="code">
    <div class="codeContent">
<pre class="code-java"><span class="code-keyword">public</span> <span class="code-keyword">interface</span> RepositoryAdmin
{
    <span class="code-keyword">public</span> Resource[] discoverResources(<span class="code-object">String</span> filterExpr);
    <span class="code-keyword">public</span> Resolver resolver();
    <span class="code-keyword">public</span> Repository addRepository(URL repository)?
        <span class="code-keyword">throws</span> Exception;
    <span class="code-keyword">public</span> <span class="code-object">boolean</span> removeRepository(URL repository);
    <span class="code-keyword">public</span> Repository[] listRepositories();
    <span class="code-keyword">public</span> Resource getResource(<span class="code-object">String</span> respositoryId);
}</pre>
    </div>
</div>

<p>In order to resolve and deploy available resources, the Repository
    Admin provides Resolver instances, which are defined as follows:</p>

<div class="code">
    <div class="codeContent">
<pre class="code-java"><span class="code-keyword">public</span> <span class="code-keyword">interface</span> Resolver
{
    <span class="code-keyword">public</span> void add(Resource resource);
    <span class="code-keyword">public</span> Requirement[] getUnsatisfiedRequirements();
    <span class="code-keyword">public</span> Resource[] getOptionalResources();
    <span class="code-keyword">public</span> Requirement[] getReason(Resource resource);
    <span class="code-keyword">public</span> Resource[] getResources(Requirement requirement);
    <span class="code-keyword">public</span> Resource[] getRequiredResources();
    <span class="code-keyword">public</span> Resource[] getAddedResources();
    <span class="code-keyword">public</span> <span class="code-object">boolean</span> resolve();
    <span class="code-keyword">public</span> void deploy(<span class="code-object">boolean</span> start);
}</pre>
    </div>
</div>

<p>When desired resources are discovered via the query mechanisms of
    the Repository Admin, they are added to a Resolver instance which will
    can be used to resolve all transitive dependencies and to reflect on
    any resolution result. The following code snippet depicts a typical
    usage scenario:</p>

<div class="code">
    <div class="codeContent">
<pre class="code-java">RepositoryAdmin repoAdmin = ... <span class="code-comment">// Get repo admin service
</span>Resolver resolver = repoAdmin.resolver();
Resource resource = repoAdmin.discoverResources(filterStr);
resolver.add(resource);
<span class="code-keyword">if</span> (resolver.resolve())
{
    resolver.deploy(<span class="code-keyword">true</span>);
}
<span class="code-keyword">else</span>
{
    Requirement[] reqs = resolver.getUnsatisfiedRequirements();
    <span class="code-keyword">for</span> (<span class="code-object">int</span> i = 0; i &lt; reqs.length; i++)
    {
        <span class="code-object">System</span>.out.println(<span class="code-quote">"Unable to resolve: "</span> + reqs[i]);
    }
}</pre>
    </div>
</div>

<p>This code gets the Repository Admin service and then gets a Resolver
    instance from it. It then discovers an available resource and adds it
    to the resolver. Then it tries to resolve the resources dependencies.
    If successful it deploys the resource to the local framework instance;
    if not successful it prints the unsatisfied requirements.</p>

<p>OBR's deployment algorithm appears simple at first glance, but it is
    actually somewhat complex due to the nature of deploying independently
    developed bundles. For example, in an ideal world, if an update for a
    bundle is made available, then updates for all of the bundles
    satisfying its dependencies are also made available. Unfortunately,
    this may not be the case, thus the deployment algorithm might have to
    install new bundles during an update to satisfy either new dependencies
    or updated dependencies that can no longer be satisfied by existing
    local bundles. In response to this type of scenario, the OBR deployment
    algorithm tries to favor updating existing bundles, if possible, as
    opposed to installing new bundles to satisfy dependencies.</p>

<p>In the general case, OBR user's will not use the OBR API directly,
    but will use its functionality indirectly from another tool or user
    interface. For example, interactive access to OBR is available via a
    command for Felix' <a href="http://cwiki.apache.org/FELIX/apache-felix-shell-service.html"
                          title="Apache Felix Shell Service">shell service</a>. The OBR shell command is discussed in
    the next section.</p>

<p><a name="ApacheFelixOSGiBundleRepository(OBR)-shellcommand"></a></p>

<h2><a name="ApacheFelixOSGiBundleRepository(OBR)-OBRShellCommand"></a>OBR Shell Command</h2>

<p>Besides providing a service API, OBR implements a Felix shell
    command for accessing its functionality. For the end user, the OBR
    shell command is accessed using the text-based or GUI-based user
    interfaces for Felix' shell service. This section describes the syntax
    for the OBR shell command.</p>

<p><a name="ApacheFelixOSGiBundleRepository(OBR)-obrhelp"></a></p>

<h3><a name="ApacheFelixOSGiBundleRepository(OBR)-{{obrhelp}}"></a><tt>obr help</tt></h3>

<p>Syntax:</p>

<div class="preformatted">
    <div class="preformattedContent">
<pre>obr help [urls | list | info | install | deploy | start | update | source]
</pre>
    </div>
</div>
<p>This command is used to display additional information about the other OBR commands.</p>

<p><a name="ApacheFelixOSGiBundleRepository(OBR)-obrlisturl"></a></p>

<h3><a name="ApacheFelixOSGiBundleRepository(OBR)-{{obrlisturl}}"></a><tt>obr list-url</tt></h3>

<p>Syntax:</p>

<div class="preformatted">
    <div class="preformattedContent">
<pre>obr list-url
</pre>
    </div>
</div>
<p>This command gets the URLs to the repository files used by the Repository Admin.</p>

<p><a name="ApacheFelixOSGiBundleRepository(OBR)-obraddurl"></a></p>

<h3><a name="ApacheFelixOSGiBundleRepository(OBR)-{{obraddurl}}"></a><tt>obr add-url</tt></h3>

<p>Syntax:</p>

<div class="preformatted">
    <div class="preformattedContent">
<pre>obr add-url [&lt;repository-file-url&gt; ...]
</pre>
    </div>
</div>
<p>This command adds a repository file to the set of repository files
    for which the Repository Admin service provides access. The repository
    file is represented as a URL. If the repository file URL is already in
    the Repository Admin's set of repository files, the request is treated
    like a reload operation.</p>

<p><a name="ApacheFelixOSGiBundleRepository(OBR)-obrremoveurl"></a></p>

<h3><a name="ApacheFelixOSGiBundleRepository(OBR)-{{obrremoveurl}}"></a><tt>obr remove-url</tt></h3>

<p>Syntax:</p>

<div class="preformatted">
    <div class="preformattedContent">
<pre>obr remove-url [&lt;repository-file-url&gt; ...]
</pre>
    </div>
</div>
<p>This command removes a repository file to the set of repository
    files for which the Repository Admin service provides access. The
    repository file is represented as a URL.</p>

<p><a name="ApacheFelixOSGiBundleRepository(OBR)-obrlist"></a></p>

<h3><a name="ApacheFelixOSGiBundleRepository(OBR)-{{obrlist}}"></a><tt>obr list</tt></h3>

<p>Syntax:</p>

<div class="preformatted">
    <div class="preformattedContent">
<pre>obr list [&lt;string&gt; ...]
</pre>
    </div>
</div>
<p>This command lists bundles available in the bundle repository. If no
    arguments are specified, then all available bundles are listed,
    otherwise any arguments are concatenated with spaces and used as a
    substring filter on the bundle names.</p>

<p><a name="ApacheFelixOSGiBundleRepository(OBR)-obrinfo"></a></p>

<h3><a name="ApacheFelixOSGiBundleRepository(OBR)-{{obrinfo}}"></a><tt>obr info</tt></h3>

<p>Syntax:</p>

<div class="preformatted">
    <div class="preformattedContent">
<pre>obr info &lt;bundle-name&gt;[;&lt;version&gt;] ...
</pre>
    </div>
</div>
<p>This command displays the meta-data for the specified bundles. If a
    bundle's name contains spaces, then it must be surrounded by quotes. It
    is also possible to specify a precise version if more than one version
    exists, such as:</p>

<div class="preformatted">
    <div class="preformattedContent">
<pre>obr info "Bundle Repository";1.0.0
</pre>
    </div>
</div>
<p>The above example retrieves the meta-data for version "1.0.0" of the bundle named "Bundle Repository".</p>

<p><a name="ApacheFelixOSGiBundleRepository(OBR)-obrdeploy"></a></p>

<h3><a name="ApacheFelixOSGiBundleRepository(OBR)-{{obrdeploy}}"></a><tt>obr deploy</tt></h3>

<p>Syntax:</p>

<div class="preformatted">
    <div class="preformattedContent">
<pre>obr deploy [-nodeps] &lt;bundle-name&gt;[;&lt;version&gt;] ... | &lt;bundle-id&gt; ...
</pre>
    </div>
</div>
<p>This command tries to install or update the specified bundles and
    all of their dependencies by default; use the "-nodeps" switch to
    ignore dependencies. You can specify either the bundle name or the
    bundle identifier. If a bundle's name contains spaces, then it must be
    surrounded by quotes. It is also possible to specify a precise version
    if more than one version exists, such as:</p>

<div class="preformatted">
    <div class="preformattedContent">
<pre>obr deploy "Bundle Repository";1.0.0
</pre>
    </div>
</div>
<p>For the above example, if version "1.0.0" of "Bundle Repository" is
    already installed locally, then the command will attempt to update it
    and all of its dependencies; otherwise, the command will install it and
    all of its dependencies.</p>

<p><a name="ApacheFelixOSGiBundleRepository(OBR)-obrstart"></a></p>

<h3><a name="ApacheFelixOSGiBundleRepository(OBR)-{{obrstart}}"></a><tt>obr start</tt></h3>

<p>Syntax:</p>

<div class="preformatted">
    <div class="preformattedContent">
<pre>obr start [-nodeps] &lt;bundle-name&gt;[;&lt;version&gt;] ...
</pre>
    </div>
</div>
<p>This command installs and starts the specified bundles and all of
    their dependencies by default; use the "-nodeps" switch to ignore
    dependencies. If a bundle's name contains spaces, then it must be
    surrounded by quotes. If a specified bundle is already installed, then
    this command has no effect. It is also possible to specify a precise
    version if more than one version exists, such as:</p>

<div class="preformatted">
    <div class="preformattedContent">
<pre>obr start "Bundle Repository";1.0.0
</pre>
    </div>
</div>
<p>The above example installs and starts the "1.0.0" version of the bundle named "Bundle Repository" and its
    dependencies.</p>

<p><a name="ApacheFelixOSGiBundleRepository(OBR)-obrsource"></a></p>

<h3><a name="ApacheFelixOSGiBundleRepository(OBR)-{{obrsource}}"></a><tt>obr source</tt></h3>

<p>Syntax:</p>

<div class="preformatted">
    <div class="preformattedContent">
<pre>obr source [-x] &lt;local-dir&gt; &lt;bundle-name&gt;[;&lt;version&gt;] ...
</pre>
    </div>
</div>
<p>This command retrieves the source archives of the specified bundles
    and saves them to the specified local directory; use the "-x" switch to
    automatically extract the source archives. If a bundle name contains
    spaces, then it must be surrounded by quotes. It is also possible to
    specify a precise version if more than one version exists, such as:</p>

<div class="preformatted">
    <div class="preformattedContent">
<pre>obr source /home/rickhall/tmp "Bundle Repository";1.0.0
</pre>
    </div>
</div>
<p>The above example retrieves the source archive of version "1.0.0" of
    the bundle named "Bundle Repository" and saves it to the specified
    local directory.</p>

<p><a name="ApacheFelixOSGiBundleRepository(OBR)-proxy"></a></p>

<h2><a name="ApacheFelixOSGiBundleRepository(OBR)-UsingOBRwithaProxy"></a>Using OBR with a Proxy</h2>

<p>If you use a proxy for Web access, then OBR will not work for you in
    its default configuration; certain system properties must be set to
    enable OBR to work with a proxy. These properties are:</p>

<ul>
    <li>http.proxyHost - the name of the proxy host.</li>
    <li>http.proxyPort - the port of the proxy host.</li>
    <li>http.proxyAuth
        - the user name and password to use when connecting to the proxy; this
        string should be the user name and password separated by a colon (e.g.,
        rickhall:mypassword).
    </li>
</ul>


<p>These system properties can be set directly on the command line when
    starting the JVM using the standard "-D&lt;prop&gt;=&lt;value&gt;"
    syntax or you can put them in the lib/system.properties file of your
    Felix installation; see documentation on configuring Felix for more
    information.</p>

<p><a name="ApacheFelixOSGiBundleRepository(OBR)-sourcepackaging"></a></p>

<h2><a name="ApacheFelixOSGiBundleRepository(OBR)-BundleSourcePackaging"></a>Bundle Source Packaging</h2>

<p>Coming soon...</p>

<p><a name="ApacheFelixOSGiBundleRepository(OBR)-feedback"></a></p>

<h2><a name="ApacheFelixOSGiBundleRepository(OBR)-Feedback"></a>Feedback</h2>

<p>Subscribe to the Felix users mailing list by sending a message to <span class="nobr"><a
        href="mailto:users-subscribe@felix.apache.org" title="Send mail to users-subscribe@felix.apache.org"
        rel="nofollow">users-subscribe@felix.apache.org<sup><img class="rendericon"
                                                                 src="apache-felix-osgi-bundle-repository-obr_files/mail_small.gif"
                                                                 alt="" align="absmiddle" border="0" height="12"
                                                                 width="13"></sup></a></span>; after subscribing, email
    questions or feedback to <span class="nobr"><a href="mailto:users@felix.apache.org"
                                                   title="Send mail to users@felix.apache.org" rel="nofollow">users@felix.apache.org<sup><img
            class="rendericon" src="apache-felix-osgi-bundle-repository-obr_files/mail_small.gif" alt=""
            align="absmiddle" border="0" height="12" width="13"></sup></a></span>.</p>
</div>

</body>
</html>
